package com.nuanshui.heatedloan.fund.integration.pay.execute.sysexecute;


import com.nuanshui.heatedloan.fund.integration.form.CancelPayForm;
import com.nuanshui.heatedloan.fund.integration.form.PayForm;
import com.nuanshui.heatedloan.fund.integration.form.RequestPayForm;
import com.nuanshui.heatedloan.fund.integration.pay.execute.PayConfirmHandler;
import com.nuanshui.heatedloan.fund.integration.pay.execute.PayExecute;
import com.nuanshui.heatedloan.fund.model.PayResult;
import org.apache.commons.lang3.StringUtils;

/**
 * 具体支付业务需要继承的抽象类
 * @param 
 * @author guohao
 * @date 2017年2月16日 下午2:42:55
 * @since $
 */
public abstract   class AbstractPayExecute  implements PayExecute,PayConfirmHandler{

	
	private PayConfirmHandler payConfirmHandler;
	
	

	public PayConfirmHandler getPayConfirmHandler() {
		return payConfirmHandler;
	}

	@Override
	public void setPayConfirmHandler(PayConfirmHandler payConfirmHandler) {
		this.payConfirmHandler = payConfirmHandler;
	}

	/**
	 * 获取一个支付号
	 * @param @param requestPayForm
	 * @param @return
	 * @author guohao
	 * @date 2017年1月10日 下午3:21:50
	 * @since $
	 *  
	 * @see com.nuanshui.heatedloan.fund.integration.PayExecute#loadPayNum(com.nuanshui.heatedloan.fund.integration.form.RequestPayForm)
	 *
	 */
	@Override
	public String loadPayNum(RequestPayForm requestPayForm) {	
		return doLoadPayNum(requestPayForm);
	}
	
	/**
	 * 支付确认
	 * @param @param payForm
	 * @param @return
	 * @author guohao
	 * @date 2017年2月16日 下午2:44:04
	 * @since $
	 *  
	 * @see com.nuanshui.heatedloan.fund.integration.pay.execute.PayExecute#executeConfirmPay(com.nuanshui.heatedloan.fund.integration.form.PayForm)
	 *
	 */
	@Override
	public PayResult  executeConfirmPay(PayForm payForm) {
		return payConfirmHandler.executePaymentConfirm(payForm);
	}
	
	/**
	 * 支付取消 此方法在此不做任何功能尤其它子类实现
	 * @param @param payForm
	 * @param @return
	 * @author guohao
	 * @date 2017年2月16日 下午2:45:04
	 * @since $
	 *  
	 * @see com.nuanshui.heatedloan.fund.integration.pay.execute.PayExecute#cancelPay(com.nuanshui.heatedloan.fund.integration.form.CancelPayForm)
	 *
	 */
	@Override
	public boolean  cancelPay(CancelPayForm payForm) {
		
		return true;
	}
	
	/**
	 * 真正的支付确认
	 * @param @param payForm
	 * @param @return
	 * @author guohao
	 * @date 2017年2月16日 下午2:45:28
	 * @since $
	 *  
	 * @see com.nuanshui.heatedloan.fund.integration.pay.execute.PayConfirmHandler#executePaymentConfirm(com.nuanshui.heatedloan.fund.integration.form.PayForm)
	 *
	 */
	@Override
	public PayResult executePaymentConfirm(PayForm payForm) {
		PayResult payResult = new PayResult();
		checkPrivilege(payForm, payResult);
		if(payResult.isSuccess()){//表示校验没有问题  执行所对应的业务逻辑
			payResult = doConfirmPay(payForm,payResult);
			
		}
		handlerPayResult(payResult);
		handlerAccountBillInfo(payResult,payForm);
		if(payResult.isSuccess()) {
			confirmSuccess(payForm, payResult);
		}
		return payResult;
	}

	/**
	 * 校验业务权限
	 * @param @param payForm
	 * @param @return
	 * @author guohao
	 * @date 2017年1月10日 上午11:40:23
	 * @since $
	 */
	public void checkPrivilege(PayForm payForm,PayResult payResult){
		
	}
	
	/**
	 * 处理支付之后的结果 
	 * @param @param payResult
	 * @author guohao
	 * @date 2017年1月10日 上午11:43:34
	 * @since $
	 */
	public void handlerPayResult(PayResult payResult) {
		
	}
	
	/**
	 * 处理生成订单相关的数据
	 * @param @param payResult
	 * @author guohao
	 * @date 2017年1月10日 下午12:03:22
	 * @since $
	 */
    public void handlerAccountBillInfo(PayResult payResult,PayForm payForm) {
    	if (StringUtils.isEmpty(payResult.getUserId())) {
			payResult.setUserId(payForm.getUserId());
		}
    }
    
    /**
     * 确认成功后续工作
     * @param @param payForm
     * @param @param payResult
     * @author guohao
     * @date 2017年1月11日 上午11:18:44
     * @since $
     */
    public void confirmSuccess(PayForm payForm ,PayResult payResult) {
    	
    }
	
    /**
     * 获取支付号供子类实现
     * @param @param requestPayForm
     * @param @return
     * @author guohao
     * @date 2017年2月16日 下午2:47:07
     * @since $
     */
	public abstract String doLoadPayNum(RequestPayForm requestPayForm);
	
	/**
	 * 执行确认供子类实现
	 * @param @param payForm
	 * @param @return
	 * @author guohao
	 * @date 2017年2月16日 下午2:47:18
	 * @since $
	 */
	public abstract boolean  doCancelPay(CancelPayForm payForm);
	
	/**
	 * 执行支付确认由子类实现
	 * @param @param payForm
	 * @param @param payResult
	 * @param @return
	 * @author guohao
	 * @date 2017年2月16日 下午2:47:31
	 * @since $
	 */
	public abstract PayResult doConfirmPay(PayForm payForm,PayResult payResult);

}
